home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Demos / A.D. Software / OOFILE / Buildable, limited OOFILE / source / GUI / zApp-old / oofzapp.cpp next >
Text File  |  1995-06-04  |  30KB  |  1,263 lines

  1. // COPYRIGHT 1994 A.D. Software, All rights reserved
  2.  
  3. // zApp Integration layer of OOFILE database
  4. #include "zapp.hpp"
  5. #include "OOFzApp.hpp"
  6. #include "stdlib.h"
  7. #ifdef _Windows
  8.     #include <strstrea.h>
  9. #else
  10.     #include <strstream.h>
  11. #endif
  12. #include "fstream.h"
  13.  
  14.  // static variables
  15. dbEditMgr*  dbEditMgr::sFrontmost;
  16. zFont* dbEditMgr::sDefEditFont;
  17.  
  18. // utility function
  19.  
  20. char* newFileNameFromPath(const char*path) {
  21. #ifdef __BORLANDC__
  22.     char name[_MAX_FNAME];
  23.     char ext[_MAX_EXT];
  24.     char* ret;
  25.     int nameLen = _MAX_FNAME + _MAX_EXT;
  26.     _splitpath(path, 0, 0, name, ext);
  27.     ret = new char[nameLen];
  28.     assert(ret);
  29.     strcpy(ret, name);
  30.     strcat(ret, ext);
  31.     return ret;        // WARNING receiver must delete!
  32. #else
  33.     assert(0);   // force an error if function not avail
  34. #endif
  35. }
  36.  
  37.  
  38. // -------------------------------------------------------
  39. //                      d b E d i t M g r
  40. // -------------------------------------------------------
  41.  
  42. dbEditMgr::dbEditMgr() :
  43.                             mEditing(false),
  44.                             mNew(false),
  45.                             mChangingPages(false),
  46.                             mCurrPageCommandNum(0),
  47.                             mMenu(0),
  48.                             mCurrDialog(0),
  49.                      mPages(0),
  50.                             mDefEditFontSpec("MS Sans Serif", zDimension(0, -11),
  51.                                 FW_NORMAL, ffSwiss, VariablePitch,
  52.                                 0, 0, 0, AnsiCharSet, StringOutPrec, StrokeClipPrec, DraftQual)
  53. {
  54.     sFrontmost=this;
  55. };
  56.  
  57.  
  58. zFont* dbEditMgr::enableDefEditFont()
  59. {
  60. #ifdef OOF_Debug
  61.     if (sDefEditFont)
  62.         dbConnect::raise("dbEditMgr::enableDefEditFont called with non-zero font left in place");
  63. #endif
  64.     sDefEditFont = new zFont(mDefEditFontSpec);
  65.     return sDefEditFont;
  66. }
  67.  
  68. void dbEditMgr::setDefEditFont(zFont* theFont)
  69. {
  70. #ifdef OOF_Debug
  71.     if (sDefEditFont)
  72.         dbConnect::raise("dbEditMgr::setDefEditFont called with non-zero font left in place");
  73. #endif
  74.     sDefEditFont = theFont;
  75. }
  76.  
  77.  
  78. void dbEditMgr::leavingPage(zVBXFormDialog* leavingFrom)
  79. {
  80. // NOT IF RETAIN PAGES    delete sDefEditFont;
  81.    sDefEditFont = 0;
  82.     if (mChangingPages)
  83.         return;
  84.     if (leavingFrom->completed())
  85.         saveRecord();
  86.     mMainTable->unloadRecord();
  87.     mEditing = false;
  88.     mNew = false;
  89. }
  90.  
  91.  
  92.  void dbEditMgr::newRecord()
  93.  {
  94.     InvalidateAllPages();
  95.     assert(mMainTable);        // should be setup by now!
  96.     mNew = mEditing = true;
  97.     mMainTable->newRecord();
  98.     if (mCurrDialog) {   // left over from closing last form, NOT a page transition
  99. // NOT NEEDED - ALL OUR DIALOGS ARE deleteOnClose()        delete mCurrDialog;
  100.         mCurrDialog = 0;
  101.     }
  102. }
  103.  
  104.  
  105. void dbEditMgr::firstRecord()
  106. {
  107.     if (mEditing) {
  108.         InvalidateAllPages();
  109.         mMainTable->first();
  110.     }
  111.     else
  112.         browserSelectFirst();
  113. }
  114.  
  115.  
  116. void dbEditMgr::nextRecord()
  117. {
  118.     if (mEditing) {
  119.         InvalidateAllPages();
  120.         mMainTable->next();
  121.     }
  122.     else
  123.         browserSelectNext();
  124. }
  125.  
  126.  
  127. void dbEditMgr::prevRecord()
  128. {
  129.     if (mEditing) {
  130.         InvalidateAllPages();
  131.         mMainTable->prev();
  132.     }
  133.     else
  134.         browserSelectPrev();
  135. }
  136.  
  137.  
  138. void dbEditMgr::lastRecord()
  139. {
  140.     if (mEditing) {
  141.         InvalidateAllPages();
  142.         mMainTable->last();
  143.     }
  144.     else
  145.         browserSelectLast();
  146. }
  147.  
  148.  
  149. void dbEditMgr::InvalidateAllPages()
  150. {
  151.     unsigned int numPages = mPages.count();
  152.     for (unsigned int i=0; i<numPages; i++) {
  153.         OOF_MixEditPage* thePage = (OOF_MixEditPage*) mPages[i];  // safe downcast
  154.       thePage->invalidatePage();
  155.     }
  156. }
  157.  
  158.  
  159. void dbEditMgr::appendPage(OOF_MixEditPage* thePage)
  160. {
  161.     mPages.append((long) thePage);
  162. }
  163.  
  164.  
  165. void dbEditMgr::saveRecord()
  166. {
  167.     assert(mMainTable);        // should be setup by now!
  168.     mMainTable->saveRecord();
  169.     UpdateDisplayForEditedRecord();
  170. }
  171.  
  172. void dbEditMgr::UpdateDisplayForEditedRecord()
  173. {
  174. // do nothing - subclass overrides if it needs update
  175. }
  176.  
  177.  
  178.  void dbEditMgr::startPageTransition(zCommandEvt* ev)
  179. {
  180.     if (mMenu) {
  181.         if (mCurrPageCommandNum)
  182.             mMenu->checkItem(mCurrPageCommandNum, FALSE);
  183.     }
  184.  
  185.     if (mEditing) {
  186.         assert(mCurrDialog);  // leaving this one
  187.         mChangingPages = true;
  188.         mCurrDialog->endOk(ev);    // will trigger a callback to us leavingPage()
  189.         mChangingPages = false;
  190. // NOT NEEDED - ALL OUR DIALOGS ARE deleteOnClose()        delete mCurrDialog;
  191.         mCurrDialog = 0;     // in case some bright spark forgets to follow with completePageTransition
  192.     }
  193.     else
  194.         if (mCurrDialog) {  // is leftover from previous edit
  195. // NOT NEEDED - ALL OUR DIALOGS ARE deleteOnClose()        delete mCurrDialog;
  196.             mCurrDialog = 0;
  197.         }
  198.     mEditing = true;
  199. }
  200.  
  201.  
  202. void dbEditMgr ::completePageTransition(zVBXFormDialog* newDialog, const int newPageMenuItemNum)
  203. {
  204.     if (mMenu) {
  205.         mCurrPageCommandNum = newPageMenuItemNum;
  206.         if (mCurrPageCommandNum)
  207.             mMenu->checkItem(mCurrPageCommandNum, TRUE);
  208.     }
  209.     mCurrDialog = newDialog;
  210. }
  211.  
  212. void dbEditMgr::saveAsText(char* fileName)
  213. {
  214.     ofstream fs(fileName);
  215.     mDatabase->dumpData(fs);
  216.     fs.close();
  217. }
  218.  
  219.  
  220. void dbEditMgr::warnUser(ostream& os)
  221. {
  222. #ifdef __MWERKS__
  223.     cout << *(os.rdbuf());   // they don't define operator<<(streambuf*)
  224. #else
  225.     #ifdef _Windows
  226.         strstream oss;
  227.         oss << os.rdbuf() << ends;
  228.         char* s = oss.str();
  229.         ::MessageBox(0, s, "Warning", MB_ICONEXCLAMATION);
  230.         oss.rdbuf()->freeze(0);  // leave buffer for stream to delete
  231.     #else
  232.         cout << os.rdbuf();
  233.     #endif
  234. #endif
  235. }
  236.  
  237. // -------------------------------------------------------
  238. //              O O F _ M i x E d i t P a g e
  239. // -------------------------------------------------------
  240.  
  241. OOF_MixEditPage::OOF_MixEditPage(zVBXFormDialog* thisDialog, dbEditMgr* editMgr) :
  242.                                             mEditFont(0),
  243.                                             mEditMgr(editMgr),
  244.                                             mValid(true),
  245.                                             mThisDialog(thisDialog)
  246. {
  247.    mEditFont = mEditMgr->enableDefEditFont();  // must call before creating edit fields
  248.     mEditMgr->appendPage(this);
  249. }
  250.  
  251.  
  252. OOF_MixEditPage::~OOF_MixEditPage()
  253. {
  254.     delete mEditFont;
  255. }
  256.  
  257.  
  258. void OOF_MixEditPage::bringToFront()
  259. {
  260.     dbEditMgr::setDefEditFont(mEditFont);
  261.     if (!mValid) {
  262.         mThisDialog->setControlsToDefault();
  263.     }
  264.     mThisDialog->show();
  265. }
  266.  
  267.  
  268. // -------------------------------------------------------
  269. //              O O F _ M i x E d i t F i e l d
  270. // -------------------------------------------------------
  271. void OOF_MixEditField::CompleteInit(zControl* child)
  272. {
  273.     zFont* defFont = dbEditMgr::defEditFont();
  274.     if (defFont)
  275.         child->setFont(defFont, FALSE);
  276. }
  277.  
  278.  
  279. // -------------------------------------------------------
  280. //                    z d b E d i t L i n e
  281. // -------------------------------------------------------
  282.  
  283. zdbEditLine::zdbEditLine(zFrameWin* w, int id, dbChar& dest_, unsigned long flags) :
  284.                                 zEditLine(w, id, 0, flags),
  285.                                 mField(dest_)
  286. {
  287.     CompleteInit(this);
  288. }
  289.  
  290. int zdbEditLine::storeData() {
  291.     mField = text();
  292.     return 1;
  293. }
  294.  
  295.  
  296. int zdbEditLine::setToDefault() {
  297.     text(mField);
  298.     return 1;
  299. }
  300.  
  301.  
  302. // -------------------------------------------------------
  303. //                    z d b E d i t C o m b o
  304. // -------------------------------------------------------
  305.  
  306. zdbEditCombo::zdbEditCombo(zFrameWin* w, int id, dbChar& dest_, unsigned long flags) :
  307.                                 zComboBoxFull(w, id, (zString*)0, flags),
  308.                                 mField(dest_)
  309. {
  310.     CompleteInit(this);
  311. }
  312.  
  313. int zdbEditCombo::storeData() {
  314.     zString temp;
  315.     getEditText(temp);
  316.     mField = temp;
  317.     return 1;
  318. }
  319.  
  320.  
  321. int zdbEditCombo::setToDefault() {
  322.     add(mField);
  323.     selection(mField);
  324.     return 1;
  325. }
  326.  
  327.  
  328. // -------------------------------------------------------
  329. //                    z d b E d i t D a t e
  330. // -------------------------------------------------------
  331. zdbEditDate::zdbEditDate(zFrameWin* w, int id, dbDate& dest_, unsigned long flags) :
  332.                                 zEditLine(w, id, 0, flags),
  333.                                 mField(dest_)
  334. {
  335.     CompleteInit(this);
  336. }
  337.  
  338.  
  339.  
  340. int zdbEditDate::storeData() {
  341.     mField = text();
  342.     return 1;
  343. }  
  344.  
  345.  
  346. int zdbEditDate::setToDefault() {
  347.     text(mField);
  348.     return 1;
  349. }  
  350.  
  351.  
  352. // -------------------------------------------------------
  353. //                 z d b C h a r E d i t B o x
  354. // -------------------------------------------------------
  355. zdbCharEditBox::zdbCharEditBox(zWindow *w,zSizer* siz,DWORD style, dbChar& dest_, int id) :
  356.                         zEditBox(w, siz, style, 0, id),
  357.                         mField(dest_)
  358. {
  359. //    CompleteInit(this);
  360. }
  361.  
  362.  
  363. zdbCharEditBox::zdbCharEditBox(zFrameWin* w,int id, dbChar& dest_, unsigned long flags) :
  364.                         zEditBox(w, id, 0, flags),
  365.                         mField(dest_)
  366. {
  367. //    CompleteInit(this);
  368. }
  369.  
  370.  
  371. int zdbCharEditBox::storeData() {
  372.     mField = text();
  373.     return 1;
  374. }  
  375.  
  376.  
  377. int zdbCharEditBox::setToDefault() {
  378.     text(mField);
  379.     return 1;
  380. }
  381.  
  382.  
  383. // -------------------------------------------------------
  384. //                   z d b T e x t E d i t B o x
  385. // -------------------------------------------------------
  386. zdbTextEditBox::zdbTextEditBox(zWindow *w,zSizer* siz,DWORD style, dbText& dest_, int id) :
  387.                         zEditBox(w, siz, style, 0, id),
  388.                         mField(dest_)
  389. {
  390.     CompleteInit(this);
  391. }
  392.  
  393.  
  394. zdbTextEditBox::zdbTextEditBox(zFrameWin* w,int id, dbText& dest_, unsigned long flags) :
  395.                         zEditBox(w, id, 0, flags),
  396.                         mField(dest_)
  397. {
  398.     CompleteInit(this);
  399. }
  400.  
  401.  
  402. int zdbTextEditBox::storeData() {
  403.     mField = text();
  404.     return 1;
  405.  
  406.  
  407. int zdbTextEditBox::setToDefault() {
  408.     text(mField);
  409.     return 1;
  410. }  
  411.  
  412. // -------------------------------------------------------
  413. //               z d b R a d i o G r o u p
  414. // -------------------------------------------------------
  415. zdbRadioGroup::zdbRadioGroup(zFrameWin* w,int idLo, int idHi, dbShortInt& dest_) :
  416.                         zRadioGroup(w, idLo, idHi),
  417.                         mField(dest_)
  418. {
  419. //    CompleteInit(this);
  420. }
  421.  
  422. int zdbRadioGroup::storeData() {
  423.     int temp;
  424.     setStoreAddr(&temp);
  425.     zRadioGroup::storeData();        // let parent do all the formatting
  426.     mField = temp;                        // copy value back to record buffer via assignment
  427.     setStoreAddr(0);
  428.     return 1;
  429. }
  430.  
  431.  
  432. int zdbRadioGroup::setToDefault() {
  433.     int temp;
  434.     temp = mField;        // get value from record buffer via cast oper
  435.     setStoreAddr(&temp);
  436.     zRadioGroup::setToDefault();        // let the parent do the formatting
  437.     setStoreAddr(0);
  438.     return 1;
  439. }
  440.  
  441.  
  442.  
  443. // -------------------------------------------------------
  444. //                   z d b S h o r t E d i t
  445. // -------------------------------------------------------
  446. zdbShortEdit::zdbShortEdit(zFrameWin* w,int id, dbShortInt& dest_, char *pictStr, unsigned long flags) :
  447.                         zIntEdit(w, id, 0, pictStr, flags),
  448.                         mField(dest_)
  449. {
  450. //    CompleteInit(this);
  451. }
  452.  
  453.  
  454. zdbShortEdit::zdbShortEdit(zFrameWin* w,int id, dbShortInt& dest_, zFormatter *formatter, unsigned long flags) :
  455.                         zIntEdit(w, id, 0, formatter, flags),
  456.                         mField(dest_)
  457. {
  458. //    CompleteInit(this);
  459. }
  460.  
  461.  
  462. zdbShortEdit::zdbShortEdit(zFrameWin* w,int id, dbShortInt& dest_, unsigned long flags) :
  463.                         zIntEdit(w, id, 0, flags),
  464.                         mField(dest_)
  465. {
  466. //    CompleteInit(this);
  467. }
  468.  
  469. zdbShortEdit::zdbShortEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbShortInt& dest_, char *pictStr, unsigned long flags) :
  470.                         zIntEdit(w, siz, style, id, 0, pictStr, flags),
  471.                         mField(dest_)
  472. {
  473. //    CompleteInit(this);
  474. }
  475.  
  476. zdbShortEdit::zdbShortEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbShortInt& dest_, zFormatter *formatter, unsigned long flags) :
  477.                         zIntEdit(w, siz, style, id, 0, formatter, flags),
  478.                         mField(dest_)
  479. {
  480. //    CompleteInit(this);
  481. }
  482.  
  483. zdbShortEdit::zdbShortEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbShortInt& dest_, unsigned long flags) :
  484.                         zIntEdit(w, siz, style, id, 0, flags),
  485.                         mField(dest_)
  486. {
  487. //    CompleteInit(this);
  488. }
  489.  
  490.  
  491. int zdbShortEdit::storeData() {
  492.     int temp;
  493.     setStoreAddr(&temp);
  494.     zIntEdit::storeData();        // let parent do all the formatting
  495.     mField = temp;                        // copy value back to record buffer via assignment
  496.     setStoreAddr(0);
  497.     return 1;
  498. }
  499.  
  500.  
  501. int zdbShortEdit::setToDefault() {
  502.     int temp;
  503.     temp = mField;        // get value from record buffer via cast oper
  504.     setStoreAddr(&temp);
  505.     zIntEdit::setToDefault();        // let the parent do the formatting
  506.     setStoreAddr(0);
  507.     return 1;
  508. }
  509.  
  510.  
  511.  
  512. // -------------------------------------------------------
  513. //                   z d b L o n g E d i t
  514. // -------------------------------------------------------
  515. zdbLongEdit::zdbLongEdit(zFrameWin* w,int id, dbLong& dest_, char *pictStr, unsigned long flags) :
  516.                         zLongEdit(w, id, 0, pictStr, flags),
  517.                         mField(dest_)
  518. {
  519. //    CompleteInit(this);
  520. }
  521.  
  522.  
  523. zdbLongEdit::zdbLongEdit(zFrameWin* w,int id, dbLong& dest_, zFormatter *formatter, unsigned long flags) :
  524.                          zLongEdit(w, id, 0, formatter, flags),
  525.                         mField(dest_)
  526. {
  527. //    CompleteInit(this);
  528. }
  529.  
  530.  
  531. zdbLongEdit::zdbLongEdit(zFrameWin* w,int id, dbLong& dest_, unsigned long flags) :
  532.                          zLongEdit(w, id, 0, flags),
  533.                         mField(dest_)
  534. {
  535. //    CompleteInit(this);
  536. }
  537.  
  538.  
  539. zdbLongEdit::zdbLongEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbLong& dest_, char *pictStr, unsigned long flags) :
  540.                         zLongEdit(w, siz, style, id, 0, pictStr, flags),
  541.                         mField(dest_)
  542. {
  543. //    CompleteInit(this);
  544. }
  545.  
  546.  
  547. zdbLongEdit::zdbLongEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbLong& dest_, zFormatter *formatter, unsigned long flags) :
  548.                         zLongEdit(w, siz, style, id, 0, formatter, flags),
  549.                         mField(dest_)
  550. {
  551. //    CompleteInit(this);
  552. }
  553.  
  554.  
  555. zdbLongEdit::zdbLongEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbLong& dest_, unsigned long flags) :
  556.                         zLongEdit(w, siz, style, id, 0, flags),
  557.                         mField(dest_)
  558. {
  559. //    CompleteInit(this);
  560. }
  561.  
  562.  
  563. int zdbLongEdit::storeData() {
  564.     long temp;
  565.     setStoreAddr(&temp);
  566.     zLongEdit::storeData();
  567.     setStoreAddr(0);
  568.     mField = temp;
  569.     return 1;
  570. }  
  571.  
  572.  
  573. int zdbLongEdit::setToDefault() {
  574.     long temp;
  575.     temp = mField;
  576.     setStoreAddr(&temp);
  577.     zLongEdit::setToDefault();
  578.     setStoreAddr(0);
  579.     return 1;
  580. }
  581.  
  582.  
  583. int zdbLongEdit::checkData()
  584. {
  585.     if (mField.mHasRange) {
  586.         long temp;
  587.         setStoreAddr(&temp);
  588.         zLongEdit::storeData();
  589.         setStoreAddr(0);
  590.         if (mField.validate(temp))
  591.             return 1;
  592.         else {
  593.             dbEditMgr::warnUser(ostrstream() <<
  594.                 mField.fieldName() << " requires values between " << mField.mMin << " and "
  595.                 << mField.mMax
  596.             );
  597.             return 0;
  598.         }
  599.     }
  600.     else
  601.         return 1;
  602. }
  603.  
  604.  
  605. // -------------------------------------------------------
  606. //               z d b R e a l E d i t
  607. // -------------------------------------------------------
  608. zdbRealEdit::zdbRealEdit(zFrameWin* w,int id, dbReal& dest_, char *pictStr, unsigned long flags) :
  609.                          zDoubleEdit(w, id, 0, pictStr, flags),
  610.                         mField(dest_)
  611. {
  612. //    CompleteInit(this);
  613. }
  614.  
  615.  
  616. zdbRealEdit::zdbRealEdit(zFrameWin* w,int id, dbReal& dest_, zFormatter *formatter, unsigned long flags) :
  617.                          zDoubleEdit(w, id, 0, formatter, flags),
  618.                         mField(dest_)
  619. {
  620. //    CompleteInit(this);
  621. }
  622.  
  623.  
  624. zdbRealEdit::zdbRealEdit(zFrameWin* w,int id, dbReal& dest_, unsigned long flags) :
  625.                          zDoubleEdit(w, id, 0, flags),
  626.                         mField(dest_)
  627. {
  628. //    CompleteInit(this);
  629. }
  630.  
  631.  
  632. zdbRealEdit::zdbRealEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbReal& dest_, char *pictStr, unsigned long flags) :
  633.                         zDoubleEdit(w, siz, style, id, 0, pictStr, flags),
  634.                         mField(dest_)
  635. {
  636. //    CompleteInit(this);
  637. }
  638.  
  639.  
  640. zdbRealEdit::zdbRealEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbReal& dest_, zFormatter *formatter, unsigned long flags) :
  641.                         zDoubleEdit(w, siz, style, id, 0, formatter, flags),
  642.                         mField(dest_)
  643. {
  644. //    CompleteInit(this);
  645. }
  646.  
  647.  
  648. zdbRealEdit::zdbRealEdit(zWindow *w,zSizer* siz, DWORD style, int id , dbReal& dest_, unsigned long flags) :
  649.                         zDoubleEdit(w, siz, style, id, 0, flags),
  650.                         mField(dest_)
  651. {
  652. //    CompleteInit(this);
  653. }
  654.  
  655.  
  656. int zdbRealEdit::storeData() {
  657.     double temp;
  658.     setStoreAddr(&temp);
  659.     zDoubleEdit::storeData();
  660.     mField = temp;
  661.     setStoreAddr(0);
  662.     return 1;
  663. }
  664.  
  665.  
  666. int zdbRealEdit::setToDefault() {
  667.     double temp;
  668.     temp = mField;
  669.     setStoreAddr(&temp);
  670.     zDoubleEdit::setToDefault();
  671.     setStoreAddr(0);
  672.     return 1;
  673. }
  674.  
  675.  
  676. // -------------------------------------------------------
  677. //            d b B r o w s e V R o w M o d e l
  678. // -------------------------------------------------------
  679. int dbBrowseVRowModel::discardRow(unsigned long row)
  680. {
  681.      return 1;         // no editing so no writeback
  682. }
  683.  
  684.  
  685. int dbBrowseVRowModel::demandLoadRow(unsigned long row)
  686. {
  687. //    if (!mFields.source()->gotoRelativeRecord(row-1))
  688. //        return 0;
  689. //    for (unsigned int i=0; i<mFields.count(); i++) {        // start field iteration (horizontal)
  690. //        dbField  *theField = (dbField  *) mFields[i];           // safe downcast
  691. //        char *theString = theField->copyAsChars();
  692. //        new zTableTextCell(this,theString,zTableLoc(i+1,row));
  693. //        delete[] theString;
  694. //    }
  695.      return 1;
  696. }
  697.  
  698.  
  699. void dbBrowseVRowModel::AppendBlankRow()
  700. {
  701.     InsertBlankRow(getNumRows()+1);
  702. }
  703.  
  704.  
  705. void dbBrowseVRowModel::InsertBlankRow(unsigned long row)
  706. {
  707.     for (unsigned int i=0; i<getNumCols(); i++)
  708.         new zTableTextCell(this,"",zTableLoc(i+1,row));
  709. }
  710.  
  711.  
  712. void dbBrowseVRowModel::coverWithReadOnly()
  713. {
  714. }
  715.  
  716. // -------------------------------------------------------
  717. //                 S S T a b l e _ S h e e t
  718. // -------------------------------------------------------
  719. void SSTable_Sheet::selectCol(unsigned int theCol)
  720. {
  721.     assert(theCol);   // 1-based columns
  722.     Col() = theCol;
  723.     Row() = -1;             // all rows
  724. }
  725.  
  726. void SSTable_Sheet::selectRow(unsigned int theRow)
  727. {
  728.     assert(theRow);   // 1-based rows
  729.     Row() = theRow;
  730.     Col() = -1;             // all cols
  731. }
  732.  
  733. //
  734. // parse Spread/VBX events down into something the table can use
  735. // in the process uncoupling our table logic from how they handle
  736. // editing changes
  737. //
  738.  
  739. void SSTable_Sheet::DblClick(long Col, long Row)
  740. {
  741.     mTable->receiveDoubleClick(Col, Row);
  742. }
  743.  
  744.  
  745. void SSTable_Sheet::EditMode(long Col, long Row, int Mode, int ChangeMade)
  746. {
  747.     if (Mode==1) {  // ENTERING
  748.         if (Row!=mCurRow) {
  749.             mCurRow = Row;
  750.             mTable->enterRow(Row);
  751.         }
  752.     }
  753.     else {
  754.         if (ChangeMade)
  755.             mTable->leaveModifiedCell(Col, Row);
  756.     }
  757. }
  758.  
  759.  
  760. // -------------------------------------------------------
  761. //                     S S T a b l e
  762. // -------------------------------------------------------
  763.  
  764. SSTable::SSTable(zWindow* w, zSizer* siz, int id_, DWORD style) :
  765.                         CVBControl(w, siz, id_, "SSPP20.VBX", "SpreadSheet", "SSPP20", style),
  766.                   mCurRow(-1)
  767. {
  768.     mSheet = new SSTable_Sheet(this);
  769.     assert(mSheet);
  770. }
  771.  
  772. SSTable::SSTable(zFrameWin* w, int id_) :
  773.                         CVBControl(w, id_),
  774.                   mCurRow(-1)
  775. {
  776.     mSheet = new SSTable_Sheet(this);
  777.     assert(mSheet);
  778. }
  779.  
  780.  
  781. SSTable::~SSTable()
  782. {
  783.     delete mSheet;
  784. }
  785.  
  786. unsigned long SSTable::countRowsSelected()
  787. {
  788.     if (mSheet->OperationMode() = SS_OP_MODE_SINGLE_SELECT)
  789.         return 1;
  790.     else
  791.         return mSheet->SelModeSelCount();
  792. }
  793.  
  794.  
  795. unsigned long SSTable::selectedRow()
  796. {
  797.     unsigned long ret;
  798.     if (mSheet->OperationMode() = SS_OP_MODE_SINGLE_SELECT)
  799.         ret = mSheet->SelModeIndex()-1;
  800.      else
  801.         ret = mSheet->GetMultiSelItem(0)-1;  // ASSUMES only one selected - you would NOT
  802.                                                     // call this method if multiple selection
  803.     mSheet->Row() = ret+1;   // set internal property to match so data updates correct row
  804.     return ret;
  805. }
  806.  
  807.  
  808. unsigned long SSTable::appendBlankRow()
  809. {
  810.     unsigned long newRow = mSheet->MaxRows()+1;
  811.     mSheet->MaxRows() = newRow;
  812.     mSheet->Row() = newRow;
  813.     mSheet->Action() = SS_ACTION_INSERT_ROW;
  814.     mCurRow = newRow;
  815.     return newRow;
  816. }
  817.  
  818. void SSTable::setRowColor(long newColor)
  819. {
  820.     mSheet->Col() =-1;  // whole row
  821.     mSheet->ForeColor() = newColor;
  822. }
  823.  
  824.  
  825. long SSTable::eventVBX(zVBXEvent *theEvent)
  826. {
  827.     VBXEVENT *ptrEvent = theEvent->event();
  828.     mSheet->CallEvent(ptrEvent->EventIndex, ptrEvent->ParamList);
  829.     return 0;
  830. }
  831.  
  832.  
  833. void SSTable::selectRow(unsigned int theRow)
  834. {
  835.     mSheet->selectRow(theRow);
  836.     if (mSheet->OperationMode() = SS_OP_MODE_SINGLE_SELECT) {
  837.         mSheet->SelModeIndex() = theRow;
  838.         mSheet->SelModeSelected() = TRUE;
  839.     }
  840. }
  841.  
  842.  
  843.  
  844. // -------------------------------------------------------
  845. //                 d b S S V ie w T a b l e
  846. // -------------------------------------------------------
  847.  
  848. dbSSViewTable::dbSSViewTable(zWindow*w, zSizer* s, int id_, dbView& flds, DWORD style) :
  849.                                             SSTable(w, s, id_, style),
  850.                                             mFields(flds),
  851.                                             mHasWrappedCols(false)
  852. {
  853. }
  854.  
  855.  
  856. dbSSViewTable::dbSSViewTable(zFrameWin*w, int id_, dbView& flds) :
  857.                                             SSTable(w, id_),
  858.                                             mFields(flds),
  859.                                             mHasWrappedCols(false)
  860. {
  861. }
  862.  
  863.  
  864. void dbSSViewTable::SetColsFromView()
  865. {
  866.     SetColHeadingsFromView();
  867.     SetColWidthsFromView();
  868. }
  869.  
  870.  
  871. void dbSSViewTable::SetColHeadingsFromView()
  872. {
  873.     unsigned int numFields = mFields.count();
  874.     for (unsigned int col=0; col<numFields; col++) {        // start field iteration (horizontal)
  875.         dbField  *theField = (dbField  *) mFields[col];           // safe downcast
  876.         mSheet->SetText(col+1, 0, theField->fieldName());
  877.     }
  878. }
  879.  
  880.  
  881. void dbSSViewTable::SetColWidthsFromView()
  882. {
  883.     const int scrollBarWidth = 18;
  884.     const float twipsPerPixelFudgeFactor = 15.0;
  885.  
  886.     zRect sheetRect;
  887.     getInterior(sheetRect);   // device units (pixels) and include scrollbar?
  888. //    long totalTwips;
  889. //    mSheet->ColWidthToTwips(sheetRect.width(), totalTwips);
  890.     mSheet->UnitType() = SS_CELL_UNIT_TWIPS;
  891.  
  892.     unsigned int numFields = mFields.count();
  893.     unsigned long totalColWidth=0;
  894.     for (unsigned int i=0; i<numFields; i++) {
  895.         dbField  *theField = (dbField  *) mFields[i];           // safe downcast
  896.         totalColWidth += theField->fieldEditLen();
  897.     }
  898. //    float twipsPerColChar = totalTwips / totalColWidth;
  899.     mSheet->ReDraw() = FALSE;
  900.     int sheetWidth = sheetRect.width() - scrollBarWidth;
  901.     float twipsPerColChar = (sheetWidth * twipsPerPixelFudgeFactor) / totalColWidth ;
  902.     for (unsigned int col=0; col<numFields; col++) {        // start field iteration (horizontal)
  903.         dbField  *theField = (dbField  *) mFields[col];           // safe downcast
  904.         selectCol(col+1);
  905.         setCellTypeForField(theField);
  906.         mSheet->ColWidth() = twipsPerColChar * theField->fieldEditLen();
  907.     }
  908.     mSheet->ReDraw() = TRUE;
  909. }
  910.  
  911.  
  912. void dbSSViewTable::loadEntireTable()
  913. {
  914.     unsigned int numFields = mFields.count();
  915.     mFields.source()->start();
  916.     mSheet->ReDraw() = FALSE;
  917.     unsigned long numRows = mFields.source()->count();
  918.     for (unsigned long row=1; row<=numRows; row++) {    // iterate through records (vertical)
  919.         mSheet->Row() = row;
  920.         for (unsigned int col=0; col<numFields; col++) {        // start field iteration (horizontal)
  921.             dbField  *theField = (dbField *) mFields[col];           // safe downcast
  922.             char *str = theField->copyAsChars();
  923.             assert(str);
  924.             mSheet->SetText(col+1, row, str);
  925.             mSheet->Col() = col+1;
  926.             SetCellWidth(theField, str);
  927.             delete[] str;
  928.         }
  929.         adjustRowHeights();
  930.         mFields.source()->next();
  931.     }
  932.     mSheet->ReDraw() = TRUE;
  933. }
  934.  
  935.  
  936. void dbSSViewTable::addRowFromCurrentRecord()
  937. {
  938.     appendBlankRow();
  939.     redrawCurrentRecord(RGB(255, 0, 0));
  940. }
  941.  
  942.  
  943. void dbSSViewTable::redrawCurrentRecord(long newColor)
  944. {
  945.     int currentRow = mSheet->Row();
  946.     mSheet->ReDraw() = FALSE;
  947.     unsigned int numFields = mFields.count();
  948.     for (unsigned int col=0; col<numFields; col++) {        // start field iteration (horizontal)
  949.         dbField  *theField = (dbField  *) mFields[col];           // safe downcast
  950.         char *str = theField->copyAsChars();
  951.         mSheet->Col() =  col+1;
  952.         mSheet->Text() = str;
  953.         SetCellWidth(theField, str);
  954.     }
  955.     adjustRowHeights();
  956.     setRowColor(newColor);
  957. //    mSheet->OperationMode() = SS_OP_MODE_NORMAL;
  958.     mSheet->ReDraw() = TRUE;
  959.     mSheet->Col() = -1;
  960.     mSheet->Row() = -1;
  961.     mSheet->SortBy() = SS_SORT_BY_ROW;
  962.     mSheet->SortKey(1) = 1;
  963.     mSheet->SortKeyOrder(1)=SS_SORT_ORDER_ASCENDING;
  964.     mSheet->Action() = SS_ACTION_SORT;
  965. //    mSheet->OperationMode() = SS_OP_MODE_SINGLE_SELECT;
  966.     selectRow(currentRow);
  967.     setDirty();
  968.     update();
  969. }
  970.  
  971.  
  972. short dbSSViewTable::cellTypeOfField(dbField* theField)
  973. {
  974.     switch (theField->fieldType()) {
  975.         case intField : return SS_CELL_TYPE_INTEGER;
  976.  
  977.         case longField : return SS_CELL_TYPE_INTEGER;
  978.  
  979.         case realField : return SS_CELL_TYPE_FLOAT;
  980.  
  981.         default : return SS_CELL_TYPE_EDIT;
  982.  
  983.     }
  984.     return SS_CELL_TYPE_EDIT;
  985. }
  986.  
  987. void dbSSViewTable::setCellTypeForField(dbField* theField)
  988. {
  989.     switch (theField->fieldType()) {
  990.         case intField : mSheet->CellType() = SS_CELL_TYPE_INTEGER;
  991.             break;
  992.  
  993.         case longField : mSheet->CellType() = SS_CELL_TYPE_INTEGER;
  994.             break;
  995.  
  996.         case realField : mSheet->CellType() = SS_CELL_TYPE_FLOAT;
  997.             break;
  998.  
  999.         case dateField : colTypeIsDate(mSheet->Col(), "01011960", "12312010");
  1000.             break;
  1001.  
  1002.         default : mSheet->CellType() = SS_CELL_TYPE_EDIT;
  1003.     }
  1004. }
  1005.  
  1006. void dbSSViewTable::colTypeIsDate(const int colNum, const char* minDate, const char* maxDate)
  1007. {
  1008.     selectCol(colNum);
  1009.     mSheet->TypeDateCentury() = FALSE;
  1010.     mSheet->TypeHAlign() = SS_CELL_H_ALIGN_CENTER;
  1011.     mSheet->TypeDateFormat() = SS_CELL_DATE_FORMAT_DDMMYY;
  1012.    mSheet->CellType() = SS_CELL_TYPE_DATE;
  1013. //    if (minDate)
  1014. //        mSheet->TypeDateMin() = minDate;
  1015. //    if (maxDate)
  1016. //        mSheet->TypeDateMax() = maxDate;
  1017. }
  1018.  
  1019. void dbSSViewTable::colTypeIsCheck(const int colNum)
  1020. {
  1021. // see page 78 of SS reference
  1022.     selectCol(colNum);
  1023.     mSheet->CellType() = SS_CELL_TYPE_CHECKBOX;
  1024.     mSheet->TypeCheckText() = "";
  1025.     mSheet->TypeCheckCenter() = TRUE;
  1026. // FROM BOOK, the following is in several examples but crashed me!
  1027. //    mSheet->TypeCheckPicture(0) = mSheet->LoadPicture("");
  1028. //    mSheet->TypeCheckPicture(1) = mSheet->LoadPicture("");
  1029. //    mSheet->TypeCheckPicture(2) = mSheet->LoadPicture("");
  1030. //    mSheet->TypeCheckPicture(3) = mSheet->LoadPicture("");
  1031. //    mSheet->TypeCheckPicture(4) = mSheet->LoadPicture("");
  1032. //    mSheet->TypeCheckPicture(5) = mSheet->LoadPicture("");
  1033. }
  1034.  
  1035.  
  1036. void dbSSViewTable::colTypeIsCombo(const int colNum, const char* comboString)
  1037. {
  1038.     selectCol(colNum);
  1039.     mSheet->CellType() = SS_CELL_TYPE_COMBOBOX;
  1040.     mSheet->TypeComboBoxList() = comboString;
  1041.     mSheet->TypeComboBoxEditable() = FALSE;
  1042. }
  1043.  
  1044.  
  1045. void dbSSViewTable::colWrapsText(const int colNum)
  1046. {
  1047.     selectCol(colNum);
  1048.     mSheet->TypeEditMultiLine() = TRUE;
  1049.     mSheet->TypeTextWordWrap() = TRUE;
  1050.    mHasWrappedCols = true;
  1051. }
  1052.  
  1053.  
  1054. void dbSSViewTable::adjustRowHeights()
  1055. {
  1056.     if (mHasWrappedCols) {
  1057.         float fHeight = mSheet->MaxTextRowHeight();
  1058.       mSheet->RowHeight() = fHeight;
  1059.     }
  1060. }
  1061.  
  1062. void dbSSViewTable::SetCellWidth(dbField* theField, char* contents)
  1063. {
  1064.     if (theField->fieldType()!=textField)
  1065.         mSheet->TypeEditLen() = theField->fieldEditLen();
  1066.     else
  1067.     mSheet->TypeEditLen() = 16000;  // estimate
  1068. }
  1069.  
  1070. int dbSSViewTable::setToDefault()
  1071. {
  1072.     mSheet->MaxRows() =  mFields.source()->count();
  1073.     loadEntireTable();
  1074.     return 1;
  1075. }
  1076.  
  1077. // -------------------------------------------------------
  1078. //                     d b S S B r o w s e T a b l e
  1079. // -------------------------------------------------------
  1080. dbSSBrowseTable::dbSSBrowseTable(zWindow*w, zSizer* s, int id_, dbEditMgr* editMgr, dbView& flds, DWORD style) :
  1081.                                             dbSSViewTable(w, s, id_, flds, style),
  1082.                                             mEditMgr(editMgr)
  1083. {
  1084.     SetupSheet();
  1085.     SetColHeadingsFromView();
  1086. }
  1087.  
  1088.  
  1089. dbSSBrowseTable::dbSSBrowseTable(zFrameWin*w, int id_, dbEditMgr* editMgr, dbView& flds) :
  1090.                                             dbSSViewTable(w, id_, flds),
  1091.                                             mEditMgr(editMgr)
  1092. {
  1093.     SetupSheet();
  1094.     SetColHeadingsFromView();
  1095. }
  1096.  
  1097.  
  1098. void dbSSBrowseTable::SetupSheet()
  1099. {
  1100.     mSheet->MaxCols() =  mFields.count();
  1101.     mSheet->MaxRows() =  mFields.source()->count();
  1102.     mSheet->OperationMode() = SS_OP_MODE_SINGLE_SELECT;
  1103.     mSheet->DisplayRowHeaders() = FALSE;
  1104.     mSheet->DisplayColHeaders() = TRUE;
  1105.     mSheet->AllowResize() = TRUE;
  1106. //    mSheet->VScrollSpecial() = TRUE;
  1107. //    mSheet->ScrollBarExtMode() = TRUE;
  1108.     mSheet->CursorStyle() = SS_CURSOR_STYLE_ARROW;
  1109.    selectFirst();
  1110. }
  1111.  
  1112.  
  1113. int dbSSBrowseTable::size(zSizeEvt* evt)
  1114. {
  1115.     int ret = zWindow::size(evt);
  1116.     SetColWidthsFromView();
  1117.     return ret;
  1118. }
  1119.  
  1120.  
  1121. void dbSSBrowseTable::receiveDoubleClick(long Col, long Row)
  1122. {
  1123.     if (mEditMgr)
  1124.         mEditMgr->doubleClickedBrowser(Row-1);
  1125. }
  1126.  
  1127.  
  1128. void dbSSBrowseTable::selectFirst()
  1129. {
  1130.     mCurRow = 1;
  1131.      selectRow(mCurRow);
  1132. }
  1133.  
  1134.  
  1135. void dbSSBrowseTable::selectNext()
  1136. {
  1137.      mCurRow++;
  1138.      selectRow(mCurRow);
  1139. }
  1140.  
  1141.  
  1142. void dbSSBrowseTable::selectPrev()
  1143. {
  1144.      mCurRow--;
  1145.      selectRow(mCurRow);
  1146. }
  1147.  
  1148.  
  1149. void dbSSBrowseTable::selectLast()
  1150. {
  1151.      mCurRow = mSheet->MaxRows();
  1152.      selectRow(mCurRow);
  1153. }
  1154.  
  1155.  
  1156. void dbSSBrowseTable::SetCellWidth(dbField* theField, char* contents)
  1157. {
  1158.     mSheet->TypeEditLen() = strlen(contents);
  1159. }
  1160.  
  1161.  
  1162.  
  1163. // -------------------------------------------------------
  1164. //                     d b S S E d i t T a b l e
  1165. // -------------------------------------------------------
  1166. dbSSEditTable::dbSSEditTable(zFrameWin*w, int id_, dbView& flds) :
  1167.                                             dbSSViewTable(w, id_, flds)
  1168. {
  1169.     SetupSheet();
  1170.     SetColsFromView();
  1171. }
  1172.  
  1173.  
  1174. void dbSSEditTable::SetupSheet()
  1175. {
  1176.     mSheet->MaxCols() =  mFields.count();
  1177.     mSheet->MaxRows() =  mFields.source()->count();
  1178.     mSheet->OperationMode() = SS_OP_MODE_NORMAL;
  1179. // was SS_OP_MODE_ROWMODE; but have problems with controls not visible in that case
  1180. // Mike Betham preferred look with normal - confusing with combo boxes having to
  1181. // double-click to enter editing mode then click again on the control
  1182.     mSheet->ProcessTab() = TRUE;  // tab cells, not controls
  1183.     mSheet->EditModePermanent() = TRUE;
  1184.     mSheet->DisplayRowHeaders() = FALSE;
  1185.     mSheet->DisplayColHeaders() = TRUE;
  1186.     mSheet->AllowResize() = TRUE;
  1187.     mSheet->CursorStyle() = SS_CURSOR_STYLE_ARROW;
  1188. }
  1189.  
  1190.  
  1191. unsigned long dbSSEditTable::appendBlankRow()
  1192. {
  1193.     unsigned long newRow = SSTable::appendBlankRow();
  1194.     mFields.source()->newRecord();
  1195.  
  1196.     unsigned int numFields = mFields.count();
  1197.     for (unsigned int col=0; col<numFields; col++) {        // start field iteration (horizontal)
  1198.         dbField  *theField = (dbField  *) mFields[col];           // safe downcast
  1199.         mSheet->Col() = col+1;
  1200.         dbSSViewTable::SetCellWidth(theField);
  1201.     }
  1202.     return newRow;
  1203. }
  1204.  
  1205.  
  1206. void dbSSEditTable::enterRow(long Row)
  1207. {
  1208.     if (mCurRow != Row) {
  1209.         mCurRow = Row;
  1210.         mFields.source()->gotoRelativeRecord(Row-1);
  1211.     }
  1212. }
  1213.  
  1214.  
  1215. void dbSSEditTable::leaveModifiedCell(long Col, long Row)
  1216. {
  1217.     assert(Row==mCurRow);
  1218.     mSheet->Col() = Col;
  1219.    mSheet->Row() = Row;
  1220.     char *cellText = mSheet->GetText(Col, Row);
  1221.     dbField  *theField = (dbField *) mFields[(int)(Col-1)];           // safe downcast
  1222.     theField->setString(cellText);
  1223.     adjustRowHeights();
  1224. }
  1225.  
  1226.  
  1227. // -------------------------------------------------------
  1228. //          d b z L i s t B r o w s e T a b l e
  1229. // -------------------------------------------------------
  1230. dbzListBrowseTable::dbzListBrowseTable(zWindow*w, zSizer* s, int id_, dbView& flds, DWORD style) :
  1231.                                             zListBox(w, s, style, 0, id_),
  1232.                                             mFields(flds)
  1233. {
  1234. }
  1235.  
  1236. void dbzListBrowseTable::loadEntireTable()
  1237. {
  1238.     mFields.source()->start();
  1239.    unsigned int numFields = mFields.count();
  1240.     while (mFields.source()->more()) {
  1241.         ostrstream oss;
  1242.         for (unsigned int col=0; col< numFields; col++) {        // start field iteration (horizontal)
  1243.             dbField  *theField = (dbField  *) mFields[col];           // safe downcast
  1244.             char* str = theField->copyAsChars() ;
  1245. //            oss.width(theField->FieldLen());
  1246. //            if (theField->FieldType()==charField)
  1247.  //                oss.setf(ios::left, ios::adjustfield);
  1248. //            else
  1249. //                oss.setf(ios::right, ios::adjustfield);
  1250.             oss << str << '\t';
  1251. //            delete[] str;
  1252.         }
  1253.         char* str = oss.str();
  1254.         if (str)
  1255.             add(str);
  1256.         mFields.source()->next();
  1257.     }
  1258. }
  1259.  
  1260.  
  1261.  
  1262.